/*
 [auto_generated]
 boost/numeric/odeint/stepper/generation/make_controlled.hpp

 [begin_description]
 Factory function to simplify the creation of controlled steppers from error steppers.
 [end_description]

 Copyright 2009-2011 Karsten Ahnert
 Copyright 2009-2011 Mario Mulansky

 Distributed under the Boost Software License, Version 1.0.
 (See accompanying file LICENSE_1_0.txt or
 copy at http://www.boost.org/LICENSE_1_0.txt)
 */

#ifndef BOOST_NUMERIC_ODEINT_STEPPER_GENERATION_MAKE_CONTROLLED_HPP_INCLUDED
#define BOOST_NUMERIC_ODEINT_STEPPER_GENERATION_MAKE_CONTROLLED_HPP_INCLUDED

namespace boost {
namespace numeric {
namespace odeint {

// default template for the controller
template <class Stepper>
struct get_controller {};

// default controller factory
template <class Stepper, class Controller>
struct controller_factory {
  Controller operator()(typename Stepper::value_type abs_error, typename Stepper::value_type rel_error,
                        const Stepper& stepper) {
    return Controller(abs_error, rel_error, stepper);
  }
};

namespace result_of {
template <class Stepper>
struct make_controlled {
  typedef typename get_controller<Stepper>::type type;
};
}

template <class Stepper>
typename result_of::make_controlled<Stepper>::type
make_controlled(typename Stepper::value_type abs_error, typename Stepper::value_type rel_error,
                const Stepper& stepper = Stepper()) {
  typedef Stepper stepper_type;
  typedef typename result_of::make_controlled<stepper_type>::type controller_type;
  typedef controller_factory<stepper_type, controller_type> factory_type;
  factory_type factory;
  return factory(abs_error, rel_error, stepper);
}

}  // odeint
}  // numeric
}  // boost

#endif  // BOOST_NUMERIC_ODEINT_STEPPER_GENERATION_MAKE_CONTROLLED_HPP_INCLUDED
